package com.ittao.taoaicodeai.ai.tools;

import cn.hutool.json.JSONObject;
import com.ittao.taoaicodecommon.manage.storage.strategy.FileStorageStrategy;
import dev.langchain4j.agent.tool.P;
import dev.langchain4j.agent.tool.Tool;
import dev.langchain4j.agent.tool.ToolMemoryId;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * 文件删除工具
 * 支持 AI 通过工具调用的方式删除文件
 */
@Slf4j
@Component
public class FileDeleteTool extends BaseTool {

    @Tool("删除指定的文件或目录")
    public String deleteFile(
            @P("要删除的文件或目录的相对路径")
            String relativePath,
            @ToolMemoryId Object memoryId
    ) {
        if (relativePath == null || relativePath.trim().isEmpty()) {
            return "错误：文件路径不能为空";
        }

        try {
            // 解析memoryId获取appId和userId
            MemoryIdParser parser = MemoryIdParser.parse(memoryId);
            Long appId = parser.getAppId();
            Long userId = parser.getUserId();
            
            if (appId == null) {
                return "错误：无法从memoryId中解析出appId";
            }

            // 安全检查：判断是否为重要文件
            String fileName = relativePath.contains("/") ?
                    relativePath.substring(relativePath.lastIndexOf("/") + 1) : relativePath;
            if (isImportantFile(fileName)) {
                return "错误：不允许删除重要文件 - " + relativePath;
            }

            // 使用基类的统一路径构建方法
            String fullFilePath = buildFullFilePath(appId, userId, relativePath);

            // 使用策略模式获取当前存储策略
            FileStorageStrategy storageStrategy = getCurrentStorageStrategy();

            // 直接尝试删除文件，文件不存在会在deleteFile方法中处理
            try {
                storageStrategy.deleteFile(fullFilePath);
                return "成功删除: " + relativePath;
            } catch (Exception deleteException) {
                return "错误：文件或目录不存在或删除失败 - " + relativePath + ", 错误: " + deleteException.getMessage();
            }

        } catch (Exception e) {
            String errorMessage = "删除文件失败: " + relativePath + ", 错误: " + e.getMessage();
            log.error(errorMessage, e);
            return errorMessage;
        }
    }

    /**
     * 判断是否是重要文件，不允许删除
     */
    private boolean isImportantFile(String fileName) {
        String[] importantFiles = {
                "package.json", "package-lock.json", "yarn.lock", "pnpm-lock.yaml",
                "vite.config.js", "vite.config.ts", "vue.config.js",
                "tsconfig.json", "tsconfig.app.json", "tsconfig.node.json",
                "index.html", "main.js", "main.ts", "App.vue", ".gitignore", "README.md"
        };
        for (String important : importantFiles) {
            if (important.equalsIgnoreCase(fileName)) {
                return true;
            }
        }
        return false;
    }

    @Override
    public String getToolName() {
        return "deleteFile";
    }

    @Override
    public String getDisplayName() {
        return "删除文件";
    }

    @Override
    public String generateToolExecutedResult(JSONObject arguments) {
        String relativeFilePath = arguments.getStr("relativeFilePath");
        // 生成简洁的工具执行结果
        String result = String.format("""
                **🗑️ [工具调用]** %s %s
                """, getDisplayName(), relativeFilePath);

        // 输出前端和要持久化的内容
        return String.format("\n\n%s\n\n", result);
    }
}
